package io.zhengsh.juc.prepare;

import java.util.concurrent.TimeUnit;

/**
 * 要求：t1 线程等待 3 秒，3 秒后， t2 线程唤醒 t1 线程继续工作
 *
 * 将 notify 放在 wait 方法之前执行，t1 先 notify 了， 3 秒钟后 t2 线程再执行 wait 方法
 * 现象：
 *   程序一直无法结束
 * 结论：
 *   先 wait 后 notify 、notifyAll方法、等待中的线程才会被唤醒，否则无法被唤醒
 */
public class LockSupportDemo {

    static Object objectLock = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            // 2、唤醒线程只能唤醒当前 wait 的线程
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (objectLock) {
                System.out.println(Thread.currentThread().getName() + "\t =======> 进入锁");
                try {
                    objectLock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "\t =======> 被唤醒");
            }
        }, "A").start();

        new Thread(() -> {
            synchronized (objectLock) {
                objectLock.notify();
                System.out.println(Thread.currentThread().getName() + "\t =======> 发起通知");
            }
        }, "B").start();
    }
}
